/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.comp.dto;

import com.brain.comp.manager.PlanPagoManager;
import com.brain.comp.view.util.ConstantesComp;
import com.brain.conf.manager.*;
import com.brain.conf.dto.CondicionPagoDto;
import com.brain.conf.dto.TerceroDto;
import com.brain.conf.dto.TipoCambioDto;
import com.brain.core.common.ExportarExcelCompras;
import com.brain.core.view.util.ConstantesCore;
import com.brain.core.manager.*;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.SessionMBean;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import net.sf.jasperreports.engine.JRException;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Indra
 */
@Service
public class ComprobanteCompraManager extends ComunManager<ComprobanteCompraDto> implements Serializable {
    
    private static Logger logger = Logger.getLogger(ComprobanteCompraManager.class);
    private Long idEntidad = 185L;
    @Resource
    private DAOGenerico<ComprobanteCompraDto> springHibernateDao;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private ApplicationMBean applicationMBean;
    private final String url = "/pages/comp/comprobanteCompra/comprobanteCompra.xhtml";
    private final String urlLista = "/pages/comp/comprobanteCompra/listaComprobantesCompra.xhtml";

    /**
     * obtener Comprobante de Compra por Id
     *
     * @param id
     * @return Comprobante de Compra
     * @throws DAOException
     */
    public ComprobanteCompraDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(ComprobanteCompraDto.class, id);
    }

    /**
     * Metodo para inicializar nuevo Comprobante de Compra
     *
     * @return
     */
    public ComprobanteCompraDto inicializar() {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        ComprobanteCompraDto dto = new ComprobanteCompraDto();
        dto.setDocumentoTransaccion(ConstantesCore.ValoresDefecto.COMPROBANTES_COD_RH);
        dto.setEmpresaDto(sessionMBean.getEmpresaDto());
        dto.setProveedorDto(new TerceroDto());
        dto.setFormaPagoDto(new ParametroDto());
        dto.setCondicionPagoDto(new CondicionPagoDto());
        dto.setFechaEmision(UtilCore.Fecha.obtenerFechaActualDate());
        dto.setDescuento(BigDecimal.ZERO);
        dto.setDescuentoMonto(BigDecimal.ZERO);
        dto.setRetencion(BigDecimal.ZERO);
        dto.setRetencionMonto(BigDecimal.ZERO);
        dto.setSubTotal(BigDecimal.ZERO);
        dto.setSubTotalConRetencion(BigDecimal.ZERO);
        dto.setTotalNeto(BigDecimal.ONE);
        dto.setIsSave(Boolean.TRUE);
        if (sessionMBean.getOrganizacionDto() != null) {
            if (sessionMBean.getOrganizacionDto().getId() != null) {
                dto.setOrganizacionDto(sessionMBean.getOrganizacionDto());
                if (sessionMBean.getOrganizacionDto().getPaisDto().getRetencionHonorarios() != null) {
                    dto.setRetencion(sessionMBean.getOrganizacionDto().getPaisDto().getRetencionHonorarios());
                }
                //Obtenemos la moneda del pais de la organizacion   
                dto.setMonedaDto(sessionMBean.getOrganizacionDto().getMonedaDto());
                dto.setTotalNetoTexto(UtilCore.ConvertirNumeroATexto.convertNumberToLetter(BigDecimal.ZERO.doubleValue(), dto.getMonedaDto().getDescripcionTransac()));
            }
        }
        dto.setEstado(ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_ELABORACION);
        return dto;
    }

    /**
     * Metodo para obtener Comprobante de Compra segun filtro
     *
     * @param dtoFiltro
     * @return Lista de Comprobante de Compra
     * @throws DAOException
     */
    public List<ComprobanteCompraDto> obtener(ComprobanteCompraDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from ComprobanteCompraDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();
        
        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }
        
        if (dtoFiltro.getDescProveedor() != null && dtoFiltro.getDescProveedor().length() != 0) {
            hqsql += " and (upper(e.proveedorDto.descripcion) like '%" + dtoFiltro.getDescProveedor().toUpperCase() + "%'";
            hqsql += " or upper(e.proveedorDto.numeroDocumento) like '%" + dtoFiltro.getDescProveedor().toUpperCase() + "%')";
        }
        
        if (dtoFiltro.getFechaInicio() != null && dtoFiltro.getFechaFin() != null) {
            
            hqsql += " and e.fechaEmision between ? and ?";
            Calendar c = Calendar.getInstance();
            c.setTime(dtoFiltro.getFechaInicio());
            c.set(Calendar.HOUR, 0);
            c.set(Calendar.MINUTE, 0);
            c.set(Calendar.SECOND, 0);
            listaParametros.add(c.getTime());
            c.setTime(dtoFiltro.getFechaFin());
            c.set(Calendar.HOUR, 23);
            c.set(Calendar.MINUTE, 59);
            c.set(Calendar.SECOND, 59);
            listaParametros.add(c.getTime());
        }
        
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and e.organizacionDto.id = ?";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        }
        
        
        if (dtoFiltro.getEstado() != null && dtoFiltro.getEstado().length() != 0 && !dtoFiltro.getEstado().equals(ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_TODOS)) {
            hqsql += " and upper(e.estado) = '" + dtoFiltro.getEstado() + "'";
        }
        
        
        hqsql += " order by e.fechaEmision, e.fecha  desc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }
    
     public List<ComprobanteCompraDto> obtenerComprobantesPorNroSerieNumero(ComprobanteCompraDto dto) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from ComprobanteCompraDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();
        hqsql += " and e.nroSerie = '" + dto.getNroSerie() + "'";
        hqsql += " and e.numero = '" + dto.getNumero() + "' ";
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and e.organizacionDto.id = ?";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        }
        if (dto.getId() != null) {
            hqsql += " and e.id <> ?";
            listaParametros.add(dto.getId());
        }
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    

    /**
     * Metodo para guardar, editar Documentos de Compra
     *
     * @param dto Documento de Compra
     * @return cadena de satisfaccion
     */
    public String guardar(ComprobanteCompraDto dto) {
        
        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        try {
            if (dto.getOrganizacionDto() != null) {
                if (!verificarUniqueNroSerieNumero(dto)) {
                    return null;
                }
                if (dto.getIsSave() == null) {
                    dto.setIsSave(Boolean.TRUE);
                }
                if (dto.getIsSave()) {
                    {
                        dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
                        dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                        dto.setTerminal(sessionMBean.getSessionTerminal());
                    }
                    definirCssPorEstado(dto);
                    if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
                        dto.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
                        dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                        dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                        dto.setUsuarioGeneracionDto(sessionMBean.getSessionUsuarioDto());
                        dto.setFechaGeneracion(UtilCore.Fecha.obtenerFechaActualDate());
                        UtilCore.General.toUpperCaseDto(dto);
                        nuevo(dto);
                        mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                        recursosManager.showMessage(mensajeTrx);
                        
                        to = "";//retroceder();

                    } else if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
                        UtilCore.General.toUpperCaseDto(dto);
                        editar(dto);
                        mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                        recursosManager.showMessage(mensajeTrx);
                        to = "";//retroceder();
                    }
                    
                } else {
                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.mensaje.issave.false");
                    recursosManager.showError(mensajeTrx);
                    to = null;
                }
            } else {
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("general.mensaje.no.organizacion");
                recursosManager.showError(mensajeTrx);
                to = null;
            }
        } catch (Exception ex) {
            mensajeTrx = ex.getMessage();
            recursosManager.showError(ex.getMessage());
            logger.error(mensajeTrx);
            
            to = null;
        }
        return to;
    }
    
    public String obtenerCadenaUltimaModificacionLista(ComprobanteCompraDto dto) {
        String cad = "";
        int diasDif = UtilCore.Fecha.diferenciaDiasFechas(dto.getFecha(), UtilCore.Fecha.obtenerFechaActualDate());
        if (diasDif == 0) {
            SimpleDateFormat sdf = new SimpleDateFormat(com.brain.core.common.ConstantesCore.formatoHora);
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.hoy.a.las") + " " + sdf.format(dto.getFecha());            
        }
        else if (diasDif == 1) {
            SimpleDateFormat sdf = new SimpleDateFormat(com.brain.core.common.ConstantesCore.formatoHora);
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.ayer.a.las") + " " + sdf.format(dto.getFecha());
        }
        else if (diasDif >1 && diasDif < 7) {
            int diaSemana = 0;
            String diaTexto = "";
            Calendar calendario = Calendar.getInstance();
            calendario.setTime(UtilCore.Fecha.obtenerFechaActualDate());;
            SimpleDateFormat sdf = new SimpleDateFormat(com.brain.core.common.ConstantesCore.formatoHora);
            if (calendario.get(Calendar.DAY_OF_WEEK) > diasDif) {
                diaSemana = calendario.get(Calendar.DAY_OF_WEEK) - diasDif;
            }
            else {
                diaSemana = 7 - Math.abs(calendario.get(Calendar.DAY_OF_WEEK) - diasDif);                
            }
            diaTexto = obtenerDiaSemanaTexto(diaSemana);
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.el") + " " + diaTexto + " " + sdf.format(dto.getFecha());
        }
        else {
            Calendar calendario = Calendar.getInstance();
            calendario.setTime(dto.getFecha());
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.hace") + " " + UtilCore.Fecha.diferenciaDiasFechas(dto.getFecha(), UtilCore.Fecha.obtenerFechaActualDate()) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.dias");
        }
        return cad;
    }
    
    public String obtenerEstadoCadena(ComprobanteCompraDto dto) {
        String cad = "";
        if (dto.getFecha().after(dto.getFechaCreacion())) {
            if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_ELABORACION)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.modificado");
            }
            else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_ANULADO)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.anulado");
            }
            else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_CONFIRMADO)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.confirmado");
            }
        }
        else {
            cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.creado");
        }
        return cad;
    }
    
    public String obtenerDiaSemanaTexto(int dia) {
        String[] diasSemana = {
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.domingo.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.lunes.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.martes.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.miercoles.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.jueves.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.viernes.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.sabado.a.las")
        };
        return diasSemana[dia-1];
    }
    
    public String obtenerMesTexto(int mes) {
        String[] meses = {
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.enero"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.febrero"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.marzo"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.abril"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.mayo"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.junio"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.julio"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.agosto"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.setiembre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.octubre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.noviembre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.diciembre")            
        };
        return meses[mes];
    }
    
    public void definirCssPorEstado(ComprobanteCompraDto dto) {
        if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_ELABORACION)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssElaboracion);
        } else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_ANULADO)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssAnulado);
        } else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_CONFIRMADO)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssConfirmado);
        }
    }
    
    //No debe repetirse la combinacion {nroSerie-numero}
    public Boolean verificarUniqueNroSerieNumero(ComprobanteCompraDto dto) {
        try {
            List<ComprobanteCompraDto> lst = obtenerComprobantesPorNroSerieNumero(dto);
            if (lst != null) {
                if (!lst.isEmpty()) {
                    recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.mensaje.nroserie.numero.duplicado"));
                    return false;
                }
            }
        } catch (Exception ex) {
            recursosManager.showError("aqui" + ex.getMessage());
            logger.error(ex.getMessage());
        }
        return true;
    }
    
    public SelectItem[] siEstadosComprobanteCompraTodos() {
        SelectItem[] si = new SelectItem[4];
        si[0] = new SelectItem(ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_ELABORACION, ConstantesComp.ValoresConstantes.COMPROBANTE_DESC_ESTADO_ELABORACION);
        si[1] = new SelectItem(ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_CONFIRMADO, ConstantesComp.ValoresConstantes.COMPROBANTE_DESC_ESTADO_CONFIRMADO);
        si[2] = new SelectItem(ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_ANULADO, ConstantesComp.ValoresConstantes.COMPROBANTE_DESC_ESTADO_ANULADO);
        si[3] = new SelectItem(ConstantesComp.ValoresConstantes.COMPROBANTE_COD_ESTADO_TODOS, ConstantesComp.ValoresConstantes.COMPROBANTE_DESC_ESTADO_TODOS);
        return si;
    }
    
    public SelectItem[] siDocTransaccion() {
        SelectItem[] si = new SelectItem[2];
        si[0] = new SelectItem(ConstantesCore.ValoresDefecto.COMPROBANTES_COD_RH, ConstantesCore.ValoresDefecto.COMPROBANTES_DESC_RH);
        si[1] = new SelectItem(ConstantesCore.ValoresDefecto.COMPROBANTES_COD_RE_ARRENDAMIENTO, ConstantesCore.ValoresDefecto.COMPROBANTES_DESC_RE_ARRENDAMIENTO);
        return si;
    }
    
    public BigDecimal obtenerDescuentoPorProveedor(TerceroDto dto) {
        TerceroDescuentoManager terceroDescuentoManager = (TerceroDescuentoManager) WebServletContextListener.getApplicationContext().getBean("terceroDescuentoManager");
        return terceroDescuentoManager.obtenerDescuentoProveedor(dto);
    }
    
    public ComprobanteCompraDto recalculardatosPorMoneda(ComprobanteCompraDto dto) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        TipoCambioManager tipoCambioManager = (TipoCambioManager) WebServletContextListener.getApplicationContext().getBean("tipoCambioManager");
        ComprobanteCompraDto dtoOld = obtenerPorId(dto.getId());
        TipoCambioDto tcDto = tipoCambioManager.obtenerFactorConversionProceso(dtoOld.getMonedaDto(), dto.getMonedaDto(), sessionMBean.getOrganizacionDto().getTcCompra(),1);
        dto.setIsSave(Boolean.TRUE);
        if (tcDto.getId() == null) {
            dto.setIsSave(Boolean.FALSE);
            recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.no.tipo.cambio"));
        } else if (!tcDto.getId().equals(-1L)) {
            recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.msg1") + " " + dtoOld.getMonedaDto().getDescripcion() + UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.msg2") + " " + tcDto.getFactor() + " " + dto.getMonedaDto().getDescripcionTransac());
            dto.setSubTotal(dto.getSubTotal().multiply(tcDto.getFactor()));
        }
        dto = recalcularMontos(dto);
        return dto;
    }
    
    public ComprobanteCompraDto recalcularMontos(ComprobanteCompraDto dto) {
        if (dto.getSubTotal() != null && dto.getRetencion() != null) {
            dto.setRetencionMonto(UtilCore.Numero.dividir(dto.getSubTotal().multiply(dto.getRetencion()), BigDecimal.valueOf(Long.valueOf("100")), applicationMBean.getPrecisionDecimales()));
            dto.setSubTotalConRetencion(dto.getSubTotal().subtract(dto.getRetencionMonto()));
        }
        if (dto.getDescuento() != null && dto.getSubTotalConRetencion() != null) {
            dto.setDescuentoMonto(UtilCore.Numero.dividir(dto.getSubTotalConRetencion().multiply(dto.getDescuento()), BigDecimal.valueOf(Long.valueOf("100")), applicationMBean.getPrecisionDecimales()));
            dto.setTotalNeto(dto.getSubTotalConRetencion().subtract(dto.getDescuentoMonto()));
            dto.setTotalNetoTexto(UtilCore.ConvertirNumeroATexto.convertNumberToLetter(dto.getTotalNeto().doubleValue(), dto.getMonedaDto().getDescripcionTransac()));
            
        }
        return dto;
    }
    
    public void reordenarPlanPagos(List<PlanPagoDto> lstPlanPago) {
        PlanPagoManager planPagoManager = (PlanPagoManager) WebServletContextListener.getApplicationContext().getBean("planPagoManager");
        try {
            UtilCore.General.ordena(lstPlanPago, "orden");
            int count = 0;
            for (PlanPagoDto p : lstPlanPago) {
                count++;
                p.setOrden(count);
            }
            planPagoManager.nuevoMuchos(lstPlanPago);
        } catch (Exception ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
        }
    }
    
    public void verificarMontoLiquidarPago(ComprobanteCompraDto dto, PlanPagoDto planPagoDto) {
        try {
            PlanPagoManager planPagoManager = (PlanPagoManager) WebServletContextListener.getApplicationContext().getBean("planPagoManager");
            planPagoDto.setIsSave(Boolean.TRUE);
            BigDecimal monto = planPagoManager.obtenerSumaMontosALiquidar(dto,planPagoDto);
            if (monto == null) {
                monto = BigDecimal.ZERO;
            }
            monto = monto.add(planPagoDto.getLiquidar());
            if (monto.compareTo(dto.getTotalNeto()) > 0) {
                planPagoDto.setIsSave(Boolean.FALSE);
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("plan.pago.mensaje.sobrepaso.total"));
            }
            
        } catch (DAOException ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
        }
    }
    
    public String imprimirDto(ComprobanteCompraDto dto) {
        try {
            String nombreArchivoReporte = "ERP_COMPROBANTE_COMPRA_NRO_" + dto.getId();
            HashMap parametros = new HashMap();
            parametros.put("P_IDENTIFICADOR", dto.getId());
            recursosManager.viewReportePdf(parametros, "JComprobanteCompra", nombreArchivoReporte);
            return null;
        } catch (FileNotFoundException ex) {
            recursosManager.showError("EL ARCHIVO NO SE ENCUENTRA");
            logger.error(ex);
        } catch (JRException ex) {
            logger.error(ex);
            recursosManager.showError("ERROR EN LA COMPILACIÓN DEL REPORTE");
        } catch (IOException ex) {
            recursosManager.showError("EL ARCHIVO ESTÁ DAÑADO");
            logger.error(ex);
        } catch (SQLException ex) {
            logger.error(ex);
            recursosManager.showError("ERROR EN LA CONSULTA DEL REPORTE");
        } finally {
            return null;
        }
    }
    
    public void generarExcelSeleccionados(ExportarExcelCompras.ComprobanteCompra exp, ComprobanteCompraDto[] selectedCCs) {
        StringBuilder strCabecera = this.obtenerCabeceraExcel(exp);
        List<ComprobanteCompraDto> lst = Arrays.asList(selectedCCs);
        List lstCuerpo = this.obtenerCuerpoExcel(exp, lst);
        String nombreArchivo = "COMPROBANTE_COMPRA_" + UtilCore.Fecha.obtenerFechaHoraActual().replace(':', '_') + ".xls";
        this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
        this.recursosManager.viewArchivo(nombreArchivo);
    }
    
    public void generarExcelPorTabla(ExportarExcelCompras.ComprobanteCompra exp, List<ComprobanteCompraDto> lstCC) {
        StringBuilder strCabecera = this.obtenerCabeceraExcel(exp);
        List lstCuerpo = this.obtenerCuerpoExcel(exp, lstCC);
        String nombreArchivo = "COMPROBANTE_COMPRA_" + UtilCore.Fecha.obtenerFechaHoraActual().replace(':', '_') + ".xls";
        this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
        this.recursosManager.viewArchivo(nombreArchivo);
    }
    
    private List obtenerCuerpoExcel(ExportarExcelCompras.ComprobanteCompra exp, List<ComprobanteCompraDto> lst) {
        StringBuilder strCuerpo;
        List lstFilas = new ArrayList();
        for (ComprobanteCompraDto x : lst) {
            strCuerpo = new StringBuilder();
            if (exp.getId()) {
                strCuerpo.append(x.getId()).append("|");
            }
            if (exp.getEmpresa()) {
                strCuerpo.append(x.getEmpresaDto().getDescripcion()).append("|");
            }
            if (exp.getOrganizacion()) {
                strCuerpo.append(x.getOrganizacionDto().getDescripcion()).append("|");
            }
            if (exp.getProveedor()) {
                strCuerpo.append(x.getProveedorDto().getDescripcion()).append("|");
            }
            if (exp.getDocumentoTransaccion()) {
                strCuerpo.append(x.getDocumentoTransaccion()).append("|");
            }
            if (exp.getFormaPago()) {
                strCuerpo.append(x.getFormaPagoDto().getDescripcion()).append("|");
            }
            if (exp.getCondicionPago()) {
                strCuerpo.append(x.getCondicionPagoDto().getDescripcion()).append("|");
            }
            if (exp.getConcepto()) {
                strCuerpo.append(x.getConcepto()).append("|");
            }
            if (exp.getNroSerie()) {
                strCuerpo.append(x.getNroSerie()).append("|");
            }
            if (exp.getDireccion()) {
                if(x.getDireccion() != null){
                    strCuerpo.append(x.getDireccion()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaEmision()) {
                strCuerpo.append(x.getFechaEmision()).append("|");
            }
            if (exp.getUsuarioCreacion()) {
                if(x.getUsuarioCreacionDto() != null){
                    strCuerpo.append(x.getUsuarioCreacionDto().getDescripcion()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
                
            }
            if (exp.getFechaCreacion()) {
                if(x.getFechaCreacion() != null){
                    strCuerpo.append(x.getFechaCreacion()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getTerminalCreacion()) {
                if(x.getTerminalCreacion() != null){
                    strCuerpo.append(x.getTerminalCreacion()).append("|");
                }
                else{
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getUsuarioGeneracion()) {
                if (x.getUsuarioGeneracionDto()!= null) {
                    strCuerpo.append(x.getUsuarioGeneracionDto().getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaGeneracion()) {
                if (x.getFechaGeneracion() != null) {
                    strCuerpo.append(x.getFechaGeneracion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getUsuarioAnulacion()) {
                if (x.getUsuarioAnulacionDto() != null) {
                    strCuerpo.append(x.getUsuarioAnulacionDto().getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaAnulacion()) {
                if (x.getFechaAnulacion() != null) {
                    strCuerpo.append(x.getFechaAnulacion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getUsuarioConfirmacion()) {
                if (x.getUsuarioConfirmacionDto() != null) {
                    strCuerpo.append(x.getUsuarioConfirmacionDto().getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaConfirmacion()) {
                if (x.getFechaConfirmacion() != null) {
                    strCuerpo.append(x.getFechaConfirmacion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getEstado()) {
                strCuerpo.append(x.getEstadoTexto()).append("|");
            }

            if (exp.getMoneda()) {
                strCuerpo.append(x.getMonedaDto().getDescripcion()).append("|");
            }

            if (exp.getSubTotal()) {
                strCuerpo.append(x.getSubTotal()).append("|");
            }

            if (exp.getRetencion()) {
                strCuerpo.append(x.getRetencion()).append("|");
            }

            if (exp.getRetencionMonto()) {
                strCuerpo.append(x.getRetencionMonto()).append("|");
            }

            if (exp.getSubTotalConRetencion()) {
                strCuerpo.append(x.getSubTotalConRetencion()).append("|");
            }

            if (exp.getDescuento()) {
                strCuerpo.append(x.getDescuento()).append("|");
            }

            if (exp.getDescuentoMonto()) {
                strCuerpo.append(x.getDescuentoMonto()).append("|");
            }

            if (exp.getTotalNeto()) {
                strCuerpo.append(x.getTotalNeto()).append("|");
            }

            if (exp.getTotalNetoTexto()) {
                strCuerpo.append(x.getTotalNetoTexto()).append("|");
            }
            lstFilas.add(strCuerpo.toString());
        }
        return lstFilas;
    }
    
    private StringBuilder obtenerCabeceraExcel(ExportarExcelCompras.ComprobanteCompra exp) {
        StringBuilder strCabecera = new StringBuilder();
        if (exp.getId()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.id")).append("|");
        }
        if (exp.getEmpresa()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.empresa")).append("|");
        }
        if (exp.getOrganizacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.organizacion")).append("|");
        }
        if (exp.getProveedor()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.proveedor")).append("|");
        }
        if (exp.getDocumentoTransaccion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.doc.transaccion")).append("|");
        }
        if (exp.getFormaPago()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.forma.pago")).append("|");
        }
        if (exp.getCondicionPago()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.condicion.pago")).append("|");
        }
        if (exp.getConcepto()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.concepto")).append("|");
        }
        if (exp.getNroSerie()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.num.serie")).append("|");
        }
        if (exp.getDireccion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.direccion")).append("|");
        }
        if (exp.getFechaEmision()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.fecha.emision")).append("|");
        }
        if (exp.getUsuarioCreacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.usuario.creacion")).append("|");
        }
        if (exp.getFechaCreacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.fecha.creacion")).append("|");
        }
        if (exp.getTerminalCreacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.terminal.creacion")).append("|");
        }
        if (exp.getUsuarioGeneracion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.usuario.generacion")).append("|");
        }
        if (exp.getFechaGeneracion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.fecha.generacion")).append("|");
        }
        if (exp.getUsuarioAnulacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.usuario.anulacion")).append("|");
        }
        if (exp.getFechaAnulacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.fecha.anulacion")).append("|");
        }
        if (exp.getUsuarioConfirmacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.usuario.confirmacion")).append("|");
        }
        if (exp.getFechaConfirmacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.fecha.confirmaicon")).append("|");
        }
        if (exp.getEstado()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.estado")).append("|");
        }

        if (exp.getMoneda()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.moneda")).append("|");
        }

        if (exp.getSubTotal()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.sub.total")).append("|");
        }

        if (exp.getRetencion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.retencion")).append("|");
        }

        if (exp.getRetencionMonto()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.retencion.monto")).append("|");
        }

        if (exp.getSubTotalConRetencion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.subtot.con.retencion")).append("|");
        }

        if (exp.getDescuento()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.descuento")).append("|");
        }

        if (exp.getDescuentoMonto()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.descuento.monto")).append("|");
        }

        if (exp.getTotalNeto()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.total.neto")).append("|");
        }

        if (exp.getTotalNetoTexto()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("comprobante.compra.total.neto.texto")).append("|");
        }
        return strCabecera;
    }
    
    public ExportarExcelCompras.ComprobanteCompra onChangeChekExcel(Boolean flag) {
       return new ExportarExcelCompras.ComprobanteCompra(flag);
    }
    
    public void nuevoMuchos(List<DocumentoCompraDto> lista) throws DAOException {
        springHibernateDao.guardarColeccion(lista);
    }
    
    public void eliminarMuchos(List<DocumentoCompraDto> lista) throws DAOException {
        springHibernateDao.borrarColeccion(lista);
    }
    
    public static Logger getLogger() {
        return logger;
    }
    
    public static void setLogger(Logger logger) {
        ComprobanteCompraManager.logger = logger;
    }
    
    public Long getIdEntidad() {
        return idEntidad;
    }
    
    public void setIdEntidad(Long idEntidad) {
        this.idEntidad = idEntidad;
    }
    
    public DAOGenerico<ComprobanteCompraDto> getSpringHibernateDao() {
        return springHibernateDao;
    }
    
    public void setSpringHibernateDao(DAOGenerico<ComprobanteCompraDto> springHibernateDao) {
        this.springHibernateDao = springHibernateDao;
    }
    
    public RecursosManager getRecursosManager() {
        return recursosManager;
    }
    
    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }
    
    public String getUrl() {
        return url;
    }
    
    public String getUrlLista() {
        return urlLista;
    }
}
